/**
 * 角色权限数据访问层 - RBAC权限模型中角色权限的数据库操作接口
 *
 * 开发人员：陈宏伟
 * 开发时间：2025-10-20 至 2025-10-25
 * 模块职责：定义角色权限的数据库查询方法，支持权限分配、查询、验证等功能
 *
 * 技术要点：
 * - Spring Data JPA查询方法定义
 * - 角色权限关联查询和统计
 * - 用户权限验证和查询优化
 * - 多租户权限数据隔离设计
 * - 复杂关联查询和性能优化
 *
 * 开发故事：负责角色权限Repository的设计和实现，与权限服务深度配合，提供高效的权限数据访问和验证能力。
 */
package com.pbl.repository;

import com.pbl.entity.RolePermission;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

/**
 * 角色权限数据访问接口 - 提供角色权限的CRUD操作和权限验证功能
 */
public interface RolePermissionRepository extends JpaRepository<RolePermission, Long> {

    /**
     * 查询指定角色的所有权限
     * @param roleId 角色ID
     * @return 角色权限列表
     */
    List<RolePermission> findByRole_Id(Long roleId);

    /**
     * 查询指定用户的所有权限（通过用户角色关联）
     * @param userId 用户ID
     * @return 权限列表
     */
    @Query("SELECT rp FROM RolePermission rp " +
           "JOIN rp.role r " +
           "JOIN UserRole ur ON ur.role.id = r.id " +
           "WHERE ur.user.id = ?1")
    List<RolePermission> findByUserId(Long userId);

    /**
     * 检查用户是否具有指定权限
     * @param userId 用户ID
     * @param permissionCode 权限代码
     * @return 是否具有该权限
     */
    @Query("SELECT COUNT(rp) > 0 FROM RolePermission rp " +
           "JOIN rp.role r " +
           "JOIN UserRole ur ON ur.role.id = r.id " +
           "WHERE ur.user.id = ?1 AND rp.permissionCode = ?2")
    boolean userHasPermission(Long userId, String permissionCode);
}

